package top.hudk.sync;

/**
 * @author hudk
 * @date 2020/12/11 21:47
 */
public class Sync {

    /**
     * synchronized在普通方法上，锁的是this对象
     */
    public synchronized void test1(){
        System.out.println("method synchronized");
    }

    /**
     * synchronized用在静态方法上，锁的是当下类对应的Class类型对象的实例
     */
    public static synchronized void test2(){
        System.out.println("static method synchronized");
    }

    /**
     * 自定义被锁的对象实例
     */
    final Object object = new Object();


    public void test3(){
        /**
         * synchronized用于代码块上，可以锁定自定义的类型实例
         * 且引用值不可以改变，否则运行过程中如果引用值改变，就相当于引用指向了别的对象，
         * 锁定的对象改变了，锁自然补发正常工作。
         * 这也是自定义的所对象不可以是String，Integer等的原因
         * 因为指向这些对象的引用，很容易发生变化
         */
        synchronized (object){
            System.out.println("code block synchronized");
        }
    }
}
